進入網頁相關的東西了,原本今天要介紹reflect
,發現自己理解不來那是幹嘛的,所以直接先進Web吧!!
Go就提供了完整的http
套件,其中也包含了GET、HEAD、POST、PUT、PATCH、DELETE、CONNECT、OPTION、TRACE等等相關的http
方法,詳細可以從Go的官方文件看。
第一步一定是import
import (
"log"
"net/http"
)
log
通常是用來輸出錯誤訊息的。net/http
就是本次的主角,相關功能都在這套件內。這是一個傳送http
要求的方法,可以看到方法內有兩個參數,response
與request
。
func test(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
io.WriteString(w, "Hello Web")
}
reponse
內的header
寫入StatusOK
,這邊的數值以常數封裝在http
套件內,可以從官網看到各項資料。本例的http.StatusOK
是200
。response
的內容。func main() {
http.HandleFunc("/", test)
http.ListenAndServe(":8080", nil)
}
routing
,以本例來說是將上方test
方法與根目錄/
綁定,也就是網頁透過根目錄方問時會啟動test
方法。http.ListenAndServe
開始建立服務,並監聽我們設定的埠,內有兩個參數分別是address
與handler
。
address
: 本例設定了要監聽的port
為8080
。handler
: 本例沒有使用,因此是nil
。成功執行後在127.0.0.1:8080
即可看見顯示Hello Web的網頁了!
雖然上面那樣就成功了,但出錯時會完全沒有頭緒,因此需要設監聽錯誤的功能,log
就派上用場了,將ListenAndServe()
改成用下面的方法執行,在連線出問題時才會有錯誤提醒。
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
完整程式碼如下
package main
import (
"log"
"net/http"
"io"
)
func test(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
io.WriteString(w, "Hello Web")
}
func main() {
http.HandleFunc("/", test)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
由於上面的response
只是回傳文字而已,想讓他長得像網頁的話,就要讓他回傳html
格式的文字。
func test(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
str := `<!DOCTYPE html>
<html>
<head><title>首頁</title></head>
<body><h1>首頁</h1><p>啦啦啦啦啦啦啦</p></body>
</html>`
io.WriteString(w, str)
}
直接在response
內回傳html
格式的文字,執行後就稍微看起來像網頁一點了。
但想想,不可能寫好html
後還複製到response
內去使用吧?一定得讓程式自己讀取html
檔案才行,下面就試著這麼做吧。
要讀取html
檔,首先要有個html
檔吧,在跟main.go
同一層目錄的位置隨意寫個index.html
。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Golang-test</title>
</head>
<body>
<h1>Hello, web</h1>
</body>
</html>
有了html
檔之後,再來就是去Go內部讀取了,要使用html
檔會使用到html/template
這個套件。
import (
"html/template"
"log"
"net/http"
)
引入套件後再稍微改下程式碼。
func test(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
t := template.Must(template.ParseFiles("./index.html"))
t.Execute(w, nil)
}
index.html
為基礎建立一個template
物件。t.Execute()
執行template
物件,其中一個參數是response
,第二個參數是用來傳動態資料的,本例沒有使用。執行後就能在127.0.0.1:8080
看見自己index.html
的網頁。
使用template
的最主要用意是希望網頁能動態調整內容,讓網頁有點彈性,能夠隨著傳入的資料不同有不同的呈現。
首先要先更改index.html
,找出我們要動態調整的地方。
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{.Title}}</title>
</head>
<body>
<h1>{{.Title}}</h1>
<p>{{.Content}}</p>
</body>
</html>
Go內也要跟著做點修正
type HtmlData struct{
Title string
Content string
}
func test(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
t := template.Must(template.ParseFiles("./index.html"))
data := HtmlData{"大 大 大優惠","貓咪大戰爭~六周年~"}
t.Execute(w, data)
}
Go會自動將名稱一致的資料傳入,因此執行時就會看到網頁隨著傳入的資訊不同而變更了。
基本上透過Go內建的套件就能建立基本的網頁了,基礎的介紹完明天就來介紹Go裡面的Gin
框架吧。
Day4 | 無痛使用 Golang 打造屬於自己的網頁
https://ithelp.ithome.com.tw/articles/10233981
Go 建立一個簡單的 web 服務
https://willh.gitbook.io/build-web-application-with-golang-zhtw/03.0/03.2